using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._Raster._OrthoMapping
{
    /// <summary>
    /// <para>Append Control Points</para>
    /// <para>Combines control points to an existing control point table.</para>
    /// <para>将控制点合并到现有控制点表中。</para>
    /// </summary>    
    [DisplayName("Append Control Points")]
    public class AppendControlPoints : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public AppendControlPoints()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_master_control_points">
        /// <para>Target Control Points</para>
        /// <para>The input control point table. This is usually the output from the Compute Tie Points tool.</para>
        /// <para>输入控制点表。这通常是计算连接点工具的输出。</para>
        /// </param>
        /// <param name="_in_input_control_points">
        /// <para>Input Control Points</para>
        /// <para>A point feature class that stores control points. It could be the control point table created from the Compute Control Points tool, the Compute Tie Points tool, or a point feature class that has ground control points.</para>
        /// <para>存储控制点的点要素类。它可以是从计算控制点工具、计算连接点工具或具有地面控制点的点要素类创建的控制点表。</para>
        /// </param>
        public AppendControlPoints(object _in_master_control_points, object _in_input_control_points)
        {
            this._in_master_control_points = _in_master_control_points;
            this._in_input_control_points = _in_input_control_points;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "Append Control Points";

        public override string CallName => "management.AppendControlPoints";

        public override List<string> AcceptEnvironments => [];

        public override object[] ParameterInfo => [_in_master_control_points, _in_input_control_points, _in_z_field, _in_tag_field, _in_dem, _out_master_control_points, _in_xy_accuracy, _in_z_accuracy, _Geoid.GetGPValue(), _area_of_interest, _append_option.GetGPValue()];

        /// <summary>
        /// <para>Target Control Points</para>
        /// <para>The input control point table. This is usually the output from the Compute Tie Points tool.</para>
        /// <para>输入控制点表。这通常是计算连接点工具的输出。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Target Control Points")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_master_control_points { get; set; }


        /// <summary>
        /// <para>Input Control Points</para>
        /// <para>A point feature class that stores control points. It could be the control point table created from the Compute Control Points tool, the Compute Tie Points tool, or a point feature class that has ground control points.</para>
        /// <para>存储控制点的点要素类。它可以是从计算控制点工具、计算连接点工具或具有地面控制点的点要素类创建的控制点表。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Control Points")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_input_control_points { get; set; }


        /// <summary>
        /// <para>Z Value Field Name</para>
        /// <para><xdoc>
        ///   <para>The field that stores the control point z-values.</para>
        ///   <para>If both the Z Value Field Name and the Input DEM parameters are set, the Z value field is used. If neither the Z Value Field Name nor the Input DEM parameter is set, the z-value is set to 0 for all ground control points and check points.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>存储控制点 z 值的字段。</para>
        ///   <para>如果同时设置了 Z 值字段名称和输入 DEM 参数，则使用 Z 值字段。如果既未设置 Z 值字段名称，也未设置输入 DEM 参数，则所有地面控制点和检查点的 z 值均设置为 0。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Z Value Field Name")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _in_z_field { get; set; } = null;


        /// <summary>
        /// <para>Tag Field Name</para>
        /// <para>A field in the input control point table that has a unique value. This field will be added to the target control point table, where the tag field can be used to bring in identifiers associated with ground control points.</para>
        /// <para>输入控制点表中具有唯一值的字段。此字段将添加到目标控制点表中，其中标签字段可用于引入与地面控制点关联的标识符。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Tag Field Name")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _in_tag_field { get; set; } = null;


        /// <summary>
        /// <para>Input DEM</para>
        /// <para><xdoc>
        ///   <para>A DEM to use to obtain the z-value for the control points in the input control point table.</para>
        ///   <para>If both the Z Value Field Name and Input DEM parameters are set, the Z value field is used. If neither the Z Value Field Name nor the Input DEM parameter is set, the z-value is set to 0 for all ground control points and check points.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>用于获取输入控制点表中控制点的 z 值的 DEM。</para>
        ///   <para>如果同时设置了“Z 值字段名称”和“输入 DEM”参数，则使用 Z 值字段。如果既未设置 Z 值字段名称，也未设置输入 DEM 参数，则所有地面控制点和检查点的 z 值均设置为 0。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input DEM")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _in_dem { get; set; } = null;


        /// <summary>
        /// <para>Updated Control Points</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Updated Control Points")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _out_master_control_points { get; set; }


        /// <summary>
        /// <para>XY Accuracy</para>
        /// <para><xdoc>
        ///   <para>The input accuracy for the X and Y coordinates. The accuracy is in the same units as the Input Control Points.</para>
        ///   <para>This information should be provided by the data provider. If the accuracy information is not available, leave this optional parameter blank.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>X 和 Y 坐标的输入精度。精度与输入控制点的单位相同。</para>
        ///   <para>此信息应由数据提供者提供。如果精度信息不可用，请将此可选参数留空。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("XY Accuracy")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _in_xy_accuracy { get; set; } = null;


        /// <summary>
        /// <para>Z Accuracy</para>
        /// <para><xdoc>
        ///   <para>The input accuracy for the vertical coordinates. The accuracy is in the units of the Input Control Points.</para>
        ///   <para>This information should be provided by the data provider. If the accuracy information is not available, leave this optional parameter blank.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>垂直坐标的输入精度。精度以输入控制点为单位。</para>
        ///   <para>此信息应由数据提供者提供。如果精度信息不可用，请将此可选参数留空。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Z Accuracy")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _in_z_accuracy { get; set; } = null;


        /// <summary>
        /// <para>Geoid</para>
        /// <para><xdoc>
        ///   <para>The geoid correction is required by rational polynomial coefficients (RPC) that reference ellipsoidal heights. Most elevation datasets are referenced to sea level orthometric heights, so this correction would be required in these cases to convert to ellipsoidal heights.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—No geoid correction is made. Use this option only if your DEM is already expressed in ellipsoidal heights. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—A geoid correction will be made to convert orthometric heights to ellipsoidal heights (based on EGM96 geoid).</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>大地水准面校正由参考椭球体高度的有理多项式系数 （RPC） 进行。大多数高程数据集都参考了海平面正高，因此在这些情况下需要进行此校正才能转换为椭球体高度。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 不进行大地水准面校正。仅当 DEM 已以椭球体高度表示时，才使用此选项。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中—将进行大地水准面校正以将正高转换为椭球体高度（基于 EGM96 大地水准面）。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Geoid")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _Geoid_value _Geoid { get; set; } = _Geoid_value._false;

        public enum _Geoid_value
        {
            /// <summary>
            /// <para>GEOID</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("GEOID")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NONE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NONE")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Area of Interest</para>
        /// <para>Defines an area of interest extent by entering minimum and maximum x- and y-coordinates in the spatial reference of the input control point table.</para>
        /// <para>通过在输入控制点表的空间参考中输入最小和最大 x 和 y 坐标来定义感兴趣区域范围。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Area of Interest")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _area_of_interest { get; set; } = null;


        /// <summary>
        /// <para>Append Option</para>
        /// <para><xdoc>
        ///   <para>Specifies how control points will be appended to the control point table.</para>
        ///   <bulletList>
        ///     <bullet_item>Add all points—Add all points in the input control point table to the target control point table, including GCPs, check points, and all tie points. This is the default.</bullet_item><para/>
        ///     <bullet_item>Add GCPs only—Add only GCPs in the input point table to the target control point table.</bullet_item><para/>
        ///     <bullet_item>Add GCPs and tie points—Add GCPs and tie points specifically associated with the GCPs to the target control point table.Use caution with this option—it is applicable only when the tie points in the input and target control point table have the same transformation. The tie points might not be in the desired positions if they were computed using a different adjustment process.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定如何将控制点追加到控制点表中。</para>
        ///   <bulletList>
        ///     <bullet_item>添加所有点 - 将输入控制点表中的所有点添加到目标控制点表，包括 GCP、校验点和所有连接点。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>仅添加 GCP - 仅将输入点表中的 GCP 添加到目标控制点表。</bullet_item><para/>
        ///     <bullet_item>添加 GCP 和连接点 - 将与 GCP 专门关联的 GCP 和连接点添加到目标控制点表中。此选项请谨慎使用，仅当输入和目标控制点表中的连接点具有相同的变换时，它才适用。如果使用不同的调整过程计算连接点，则连接点可能不在所需位置。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Append Option")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _append_option_value _append_option { get; set; } = _append_option_value._ALL;

        public enum _append_option_value
        {
            /// <summary>
            /// <para>Add all points</para>
            /// <para>Add all points—Add all points in the input control point table to the target control point table, including GCPs, check points, and all tie points. This is the default.</para>
            /// <para>添加所有点 - 将输入控制点表中的所有点添加到目标控制点表，包括 GCP、校验点和所有连接点。这是默认设置。</para>
            /// </summary>
            [Description("Add all points")]
            [GPEnumValue("ALL")]
            _ALL,

            /// <summary>
            /// <para>Add GCPs only</para>
            /// <para>Add GCPs only—Add only GCPs in the input point table to the target control point table.</para>
            /// <para>仅添加 GCP - 仅将输入点表中的 GCP 添加到目标控制点表。</para>
            /// </summary>
            [Description("Add GCPs only")]
            [GPEnumValue("GCP")]
            _GCP,

            /// <summary>
            /// <para>Add GCPs and tie points</para>
            /// <para>Add GCPs and tie points—Add GCPs and tie points specifically associated with the GCPs to the target control point table.Use caution with this option—it is applicable only when the tie points in the input and target control point table have the same transformation. The tie points might not be in the desired positions if they were computed using a different adjustment process.</para>
            /// <para>添加 GCP 和连接点 - 将与 GCP 专门关联的 GCP 和连接点添加到目标控制点表中。此选项请谨慎使用，仅当输入和目标控制点表中的连接点具有相同的变换时，它才适用。如果使用不同的调整过程计算连接点，则连接点可能不在所需位置。</para>
            /// </summary>
            [Description("Add GCPs and tie points")]
            [GPEnumValue("GCPSET")]
            _GCPSET,

        }

        public AppendControlPoints SetEnv()
        {
            base.SetEnv();
            return this;
        }

    }

}